/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle.gui.frames.internos;

import controle.gui.utils.ApagaElementosDaInterface;
import gui.frames.internos.IFBusca;
import gui.frames.internos.IFImoveis;
import gui.frames.internos.IFQuadras;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import modelo.Localidade;
import modelo.Logradouro;
import persistencia.dao.AbstractDAO;

/**
 *
 * @author Maycon Fernando Silva Brito
 * @author mayconfsbrito@gmail.com
 */
public class ControleBusca {

    //Variáveis da classe
    private IFBusca frame = null;
    private boolean isBusca = false;
    private ControleQuadras controleQuadra = null;
    private ControleImoveis controleImoveis = null;

    //Construtor da classe
    public ControleBusca(IFBusca frame, ControleQuadras controleQuadra, boolean isBusca) {
        this.frame = frame;
        this.controleQuadra = controleQuadra;
        this.isBusca = isBusca;
    }

    public ControleBusca(IFBusca frame, ControleImoveis controleImoveis, boolean isBusca) {
        this.frame = frame;
        this.controleImoveis = controleImoveis;
        this.isBusca = isBusca;
    }

    /**
     * Inicializa o frame
     */
    public void inicializa() {

        //Torna o frame visível
        frame.setVisible(true);

        this.limparGUI();

        //Inicializa eventos da tabela
        frame.tabela.getSelectionModel().addListSelectionListener(frame.listener);
        frame.tabela.getColumnModel().getSelectionModel().addListSelectionListener(frame.listener);

    }

    /**
     * Limpa os componentes do frame
     */
    public void limparGUI() {

        frame.tabela.clearSelection();
        this.listarPesquisaNaTabela(null);
        new ApagaElementosDaInterface().apagaJTextField(frame.textBuscaNome);
    }

    /**
     * Especificações do método em @InternalFrame
     */
    private void listarPesquisaNaTabela(List list) {

        try {

            if (frame.objeto.equals(Localidade.class)) {

                frame.tabela.setModel(new javax.swing.table.DefaultTableModel(
                        new Object[][]{},
                        new String[]{
                            "Id", "Nome da Localidade", "Cod. Município", "Município", "Estado"
                        }) {

                    Class[] types = new Class[]{
                        java.lang.Integer.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.String.class
                    };
                    boolean[] canEdit = new boolean[]{
                        false, false, false, false, false
                    };

                    public Class getColumnClass(int columnIndex) {
                        return types[columnIndex];
                    }

                    public boolean isCellEditable(int rowIndex, int columnIndex) {
                        return canEdit[columnIndex];
                    }
                });

                frame.tabela.getColumnModel().getColumn(0).setMinWidth(40);
                frame.tabela.getColumnModel().getColumn(1).setMinWidth(300);
                frame.tabela.getColumnModel().getColumn(2).setMinWidth(40);
                frame.tabela.getColumnModel().getColumn(3).setMinWidth(100);
                frame.tabela.getColumnModel().getColumn(3).setMinWidth(20);

                DefaultTableModel modelo = (DefaultTableModel) frame.tabela.getModel();
                modelo.setNumRows(0);


                if (list != null) {
                    for (int i = 0; i < list.size(); i++) {
                        Localidade loc = (Localidade) list.get(i);
                        modelo.addRow(new Object[]{loc.getIdLocalidade(), loc.getNome(), loc.getMunicipio().getCodigo(), loc.getMunicipio().getNome(),
                                    loc.getMunicipio().getEstado()});
                    }

                } else {
                    frame.buttonOk.setEnabled(false);
                }

            } else if (frame.objeto.equals(Logradouro.class)) {

                frame.tabela.setModel(new javax.swing.table.DefaultTableModel(
                        new Object[][]{},
                        new String[]{
                            "Id", "Nome do Logradouro", "Cod. Município", "Município", "Estado"
                        }) {

                    Class[] types = new Class[]{
                        java.lang.Integer.class, java.lang.Object.class, java.lang.Object.class, java.lang.Object.class, java.lang.String.class
                    };
                    boolean[] canEdit = new boolean[]{
                        false, false, false, false, false
                    };

                    public Class getColumnClass(int columnIndex) {
                        return types[columnIndex];
                    }

                    public boolean isCellEditable(int rowIndex, int columnIndex) {
                        return canEdit[columnIndex];
                    }
                });

                frame.tabela.getColumnModel().getColumn(0).setMinWidth(40);
                frame.tabela.getColumnModel().getColumn(1).setMinWidth(300);
                frame.tabela.getColumnModel().getColumn(2).setMinWidth(40);
                frame.tabela.getColumnModel().getColumn(3).setMinWidth(100);
                frame.tabela.getColumnModel().getColumn(3).setMinWidth(20);

                DefaultTableModel modelo = (DefaultTableModel) frame.tabela.getModel();
                modelo.setNumRows(0);

                if (list != null) {
                    for (int i = 0; i < list.size(); i++) {
                        Logradouro log = (Logradouro) list.get(i);
                        modelo.addRow(new Object[]{log.getIdLogradouro(), log.getNome(), log.getMunicipio().getCodigo(), log.getMunicipio().getNome(),
                                    log.getMunicipio().getEstado()});
                    }
                }
            }

        } catch (Exception er) {
            JOptionPane.showMessageDialog(frame, "Erro ao listar os objetos na tabela!\n\n" + er, "Erro na listagem!", JOptionPane.ERROR_MESSAGE);
            er.printStackTrace();
        }
    }

    /**
     * Realiza a busca de um determinado objeto a partir dos parâmetros
     * definidos no @frame
     */
    public void buscar() {

        //Captura os parametros do frame
        String nome = frame.textBuscaNome.getText();

        List list = null;

        if (frame.objeto.equals(Logradouro.class) || frame.objeto.equals(Localidade.class)) {

            if (nome.equals("")) {
                list = null;

            } else if (frame.args != null && !frame.args.equals("")) {
                
                list = AbstractDAO.consultar("from " + frame.objeto.getName() +" l LEFT JOIN FETCH l.municipio m WHERE m." + frame.args + " AND l.nome like'%" + nome + "%'");

            } else {
                list = AbstractDAO.consultar("from " + frame.objeto.getName() +" l LEFT JOIN FETCH l.municipio WHERE l.nome like'%" + nome + "%'");

            }
        }

        //Lista os objetos encontrados na tabela
        if (list != null) {
            this.listarPesquisaNaTabela(list);
        } else {
            this.listarPesquisaNaTabela(null);

        }
    }

    /**
     * Limpa a busca
     */
    public void limparBusca() {

        this.limparGUI();

    }

    /**
     * Busca no Bd o logradouro selecionada na tabela
     *
     * @return
     */
    public Object criaObjeto() {

        int linha = frame.tabela.getSelectedRow();

        if (linha != -1) {
            if (frame.objeto == Localidade.class) {
                if (linha >= 0) {
                    List<Localidade> listLoc = AbstractDAO.consultar("Localidade", "idLocalidade=" + frame.tabela.getModel().getValueAt(linha, 0));

                    if (listLoc != null && !listLoc.isEmpty()) {
                        return listLoc.get(0);
                    }
                }
            }

            if (frame.objeto == Logradouro.class) {
                if (linha >= 0) {
                    List<Logradouro> listLog = AbstractDAO.consultar("Logradouro", "idLogradouro=" + frame.tabela.getModel().getValueAt(linha, 0));

                    if (listLog != null && !listLog.isEmpty()) {
                        return listLog.get(0);
                    }
                }
            }

        } else {
            JOptionPane.showMessageDialog(frame, "Selecione um objeto na tabela antes de confirmar a busca.",
                    "Atenção!", JOptionPane.WARNING_MESSAGE);
            return null;
        }

        JOptionPane.showMessageDialog(frame, "Erro ao selecionar o objeto na tabela. Selecione novamente.", "Atenção!", JOptionPane.WARNING_MESSAGE);

        return null;
    }

    /**
     * Inserir o objeto em outra tabela
     */
    public void enviarObjeto() {

        //Verifica qual objeto a classe está tratando
        if (frame.objeto.equals(Localidade.class)) {

            //Captura o objeto
            Localidade loc = (Localidade) this.criaObjeto();
            if (loc != null) {

                //Verifica se o objeto será envaido para um IFQuadras ou IFImoveis
                if (frame.frameClass == IFQuadras.class) {

                    if (isBusca) {
                        controleQuadra.setGuiLocalidadeBusca(loc);
                    } else {
                        controleQuadra.setGuiLocalidade(loc);
                    }

                } else if (frame.frameClass == IFImoveis.class) {

                    if (isBusca) {
                        controleImoveis.setGuiLocalidadeBusca(loc);
                    } else {
                        controleImoveis.setGuiLocalidade(loc);
                    }
                }

                frame.dispose();

            }
        } else if (frame.objeto.equals(Logradouro.class)) {

            //Captura o objeto
            Logradouro log = (Logradouro) this.criaObjeto();
            if (log != null) {

                //Verifica se o objeto será envaido para um IFQuadras
                if (frame.frameClass == IFQuadras.class) {

                    //Verifica se este mesmo logradouro já não está presente na quadra
                    if (!controleQuadra.setLogradouros.contains(log)) {

                        //Insere o logradouro no frame de quadras
                        controleQuadra.setLogradouros.add(log);
                        controleQuadra.setTabelaLogradouros();

                    } else {
                        JOptionPane.showMessageDialog(frame, "Este logradouro já está presente nesta quadra.", "Atenção!", JOptionPane.WARNING_MESSAGE);

                    }

                    //Verifica se o objeto será enviado para um IFImoveis
                } else if (frame.frameClass == IFImoveis.class) {

                    //Insere o logradouro no frame de Imoveis
                    if (this.isBusca) {
                        if (!controleImoveis.setGuiLogradouroBusca(log)) {
                            return;
                        }
                    } else {
                        if (!controleImoveis.setGuiLogradouro(log)) {
                            return;
                        }
                    }

                }

                frame.dispose();
            }
        }

    }

    /**
     * MÉTODO NÃO UTILIZADO Evento do key listener para busca automática
     */
    public void keyListener() {
        frame.textBuscaNome.addKeyListener(new KeyListener() {

            @Override
            public void keyTyped(KeyEvent e) {
                buscar();
            }

            @Override
            public void keyPressed(KeyEvent e) {
                buscar();
            }

            @Override
            public void keyReleased(KeyEvent e) {
                buscar();
            }
        });
    }

    /**
     * Gerencia os enventos do mouse sobre a tabela
     */
    public void mouseClicked(java.awt.event.MouseEvent evt) {

        frame.buttonOk.setEnabled(true);

        //Verifica se foram dados 2 clicks do mouse durante o evento
        if (evt.getClickCount() == 2) {

            //Abre o frame da Visita
            this.enviarObjeto();

        }
    }
}
